postman 如何发布x-www-urlencode请求由放心

luaexgnf  于 2023-05-17  发布在  Postman
关注(0)|答案(5)|浏览(163)

我有一个post请求,我需要发送x-www-form-urlencoded keyValue对参数,content-type应该是x-www-form-urlencoded。
在编码之前,我已经在postman中成功尝试过,只是添加了Header“Content-Type=application/x-www-form-urlencoded”和x-www-form-urlencoded body。
下面是我的代码:`

RestAssured.baseURI="****"
        RequestSpecification request = RestAssured.given().config(RestAssured.config()
                .encoderConfig(EncoderConfig.encoderConfig()
                .encodeContentTypeAs("x-www-form-urlencoded",
                 ContentType.URLENC)))
                .contentType(ContentType.URLENC.withCharset("UTF-8"))
                .formParam("grant_type", *)
                .formParam("code", *)
                .formParam("client_id",*)
                .when().log().all()
                .then().log().all().request()
        request.post("/oauth2/token")`

我猜放心张贴为formParam不是“x-www-form-urlencoded”?这是放心日志:”

Request method: POST
Request URI:    ***
Proxy:          <none>
Request params: <none>
Query params:   <none>
Form params:    grant_type=***
                code=***
                client_id=***
Path params:    <none>
Headers:        Accept=image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap
                Content-Type=application/x-www-form-urlencoded; charset=UTF-8
Cookies:        <none>
Multiparts:     <none>
Body:           <none>
HTTP/1.1 405 Method Not Allowed
Content-Length: 61
Date: Tue, 30 Jan 2018 06:59:20 GMT
X-Correlationid: 5d155b6f-0d85-4775-5f50-82c397e5b44b
X-Smp-Log-Correlation-Id: 5d155b6f-0d85-4775-5f50-82c397e5b44b
X-Vcap-Request-Id: 5d155b6f-0d85-4775-5f50-82c397e5b44b
Only support Content-Type:application/x-www-form-urlencoded

“这个问题让我发疯了好几天。请让我知道是否有任何其他方式发送x-www-form-urlencoded参数或代码中需要的一些更新。
多谢了!

omqzjyyz

omqzjyyz1#

Response response = RestAssured
    .given()
    .contentType("application/x-www-form-urlencoded; charset=utf-8")
        .formParam("grant_type", "password")
        .formParam("username", user_email)
        .formParam("password", user_password)
        .formParam("audience", audience)
        .formParam("scope", "openid email")
        .formParam("client_id", REGULAR_APP_CLIENT_ID)
        .formParam("client_secret", REGULAR_APP_SECRET_ID)
    .when()
        .post(AUTH0_URL);
gdx19jrr

gdx19jrr2#

如果你需要在请求体中包含参数:

String body = String.format("grant_type=%s&code=%s&clientid=%s", grantType, code, clientId);
Response response = given().with().
header("Content-Type", "application/x-www-form-urlencoded").
body(body).
post("/oauth2/token");

URL中参数的大小写:

Response response = given().with().
header("Content-Type", "application/x-www-form-urlencoded").
post("/oauth2/token?grant_type={type}&code={code}&clientid={id}");

标头中参数的情况(也可以使用标头对象io.restassured.http.Header):

Response response = given().with().
header("Content-Type", "application/x-www-form-urlencoded").
header("grant_type", type).
header("code", code).
header("clientid", id).
post("/oauth2/token");

顺便说一句,使用static给予()来避免重复配置

public static RequestSpecification given() {
RestAssured.config = RestAssured.config().
...;
return given().baseUrl(BASE_URL).contentType(ContentType.URLENC);
}
6jjcrrmo

6jjcrrmo3#

这个方法对我很有效

public String getAuthForKeyCloak() {

    Response response = RestAssured.given().with().auth().preemptive()
            .basic(props.get("keycloak_username"), props.get("keycloak_password"))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .formParam("grant_type", props.get("keycloak_granttype"))
            .formParam("client_id", props.get("keycloak_clientid"))
            .formParam("username", props.get("keycloak_username"))
            .formParam("password", props.get("keycloak_password")).when()
            .post(ApplnURIForKeyCloak + props.get("keycloakAuthURL"));

    System.out.println(response.getBody().asString());

    String responseBody = response.getBody().asString();
    String token = new org.json.JSONObject(responseBody).getString("access_token");
    System.out.println(token);
    return token;
    }
mwecs4sa

mwecs4sa4#

使用RA EncoderConfig对content-type x-www-form-urlencoded的内容类型进行编码。另外,将有效负载作为表单参数发布

RequestSpecBuilder.setConfig(RestAssured.config().sslConfig(SSLConfig.sslConfig().relaxedHTTPSValidation())
                .encoderConfig(EncoderConfig.encoderConfig()
                        .encodeContentTypeAs("x-www-form-urlencoded",
                                ContentType.URLENC)))
                .setContentType("application/x-www-form-urlencoded; charset=UTF-8");
wdebmtf2

wdebmtf25#

我遇到了同样的问题,终于找到了解决办法:
了解问题:Rest Assured会自动在内容类型后串联字符集,即使您没有指定字符集。
也就是说,如果您将Content-Type设置为application/x-www-form-urlencoded,它将自动为其设置默认字符集,并且您的日志将显示:
Content-Type=application/x-www-form-urlencoded; charset=ISO-8859-1或其他字符集。
我的问题是,我需要内容类型没有任何字符集,否则它不会被接受并返回状态代码400。
解决方案是确保您发送的内容类型没有任何字符集。
如何用途:在设置内容类型之前,添加此行:

RequestSpecification rs= RestAssured.given();

rs.config(RestAssured.config().encoderConfig(encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false)));

this part : 
appendDefaultContentCharsetToContentTypeIfUndefined(false)))

将确保没有字符集将被追加到您的内容类型。
然后设置header:

rs.header("Content-Type", "application/x-www-form-urlencoded");

相关问题