Skip to content

Commit

Permalink
fix: resolve byte body
Browse files Browse the repository at this point in the history
  • Loading branch information
yndu13 committed Nov 23, 2023
1 parent 288fcd0 commit 861e845
Show file tree
Hide file tree
Showing 16 changed files with 397 additions and 21 deletions.
16 changes: 14 additions & 2 deletions csharp/core/Client.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1604,7 +1604,13 @@ public Dictionary<string, object> DoRequest(Params params_, OpenApiRequest reque
{
if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body))
{
if (AlibabaCloud.TeaUtil.Common.EqualString(params_.ReqBodyType, "json"))
if (AlibabaCloud.TeaUtil.Common.EqualString(params_.ReqBodyType, "byte"))
{
byte[] byteObj = AlibabaCloud.TeaUtil.Common.AssertAsBytes(request.Body);
hashedRequestPayload = AlibabaCloud.OpenApiUtil.Client.HexEncode(AlibabaCloud.OpenApiUtil.Client.Hash(byteObj, signatureAlgorithm));
request_.Body = TeaCore.BytesReadable(byteObj);
}
else if (AlibabaCloud.TeaUtil.Common.EqualString(params_.ReqBodyType, "json"))
{
string jsonObj = AlibabaCloud.TeaUtil.Common.ToJSONString(request.Body);
hashedRequestPayload = AlibabaCloud.OpenApiUtil.Client.HexEncode(AlibabaCloud.OpenApiUtil.Client.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(jsonObj), signatureAlgorithm));
Expand Down Expand Up @@ -1870,7 +1876,13 @@ public async Task<Dictionary<string, object>> DoRequestAsync(Params params_, Ope
{
if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body))
{
if (AlibabaCloud.TeaUtil.Common.EqualString(params_.ReqBodyType, "json"))
if (AlibabaCloud.TeaUtil.Common.EqualString(params_.ReqBodyType, "byte"))
{
byte[] byteObj = AlibabaCloud.TeaUtil.Common.AssertAsBytes(request.Body);
hashedRequestPayload = AlibabaCloud.OpenApiUtil.Client.HexEncode(AlibabaCloud.OpenApiUtil.Client.Hash(byteObj, signatureAlgorithm));
request_.Body = TeaCore.BytesReadable(byteObj);
}
else if (AlibabaCloud.TeaUtil.Common.EqualString(params_.ReqBodyType, "json"))
{
string jsonObj = AlibabaCloud.TeaUtil.Common.ToJSONString(request.Body);
hashedRequestPayload = AlibabaCloud.OpenApiUtil.Client.HexEncode(AlibabaCloud.OpenApiUtil.Client.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(jsonObj), signatureAlgorithm));
Expand Down
10 changes: 9 additions & 1 deletion golang/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -1321,7 +1321,15 @@ func (client *Client) DoRequest(params *Params, request *OpenApiRequest, runtime
request_.Headers["content-type"] = tea.String("application/octet-stream")
} else {
if !tea.BoolValue(util.IsUnset(request.Body)) {
if tea.BoolValue(util.EqualString(params.ReqBodyType, tea.String("json"))) {
if tea.BoolValue(util.EqualString(params.ReqBodyType, tea.String("byte"))) {
byteObj, _err := util.AssertAsBytes(request.Body)
if _err != nil {
return _result, _err
}

hashedRequestPayload = openapiutil.HexEncode(openapiutil.Hash(byteObj, signatureAlgorithm))
request_.Body = tea.ToReader(byteObj)
} else if tea.BoolValue(util.EqualString(params.ReqBodyType, tea.String("json"))) {
jsonObj := util.ToJSONString(request.Body)
hashedRequestPayload = openapiutil.HexEncode(openapiutil.Hash(util.ToBytes(jsonObj), signatureAlgorithm))
request_.Body = tea.ToReader(jsonObj)
Expand Down
82 changes: 82 additions & 0 deletions golang/client/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -831,3 +831,85 @@ func TestResponseBodyType(t *testing.T) {
accessDeniedDetail, _ := err.AccessDeniedDetail["test"].(int)
tea_util.AssertEqual(t, 0, accessDeniedDetail)
}

func TestRequestBodyType(t *testing.T) {
mux := http.NewServeMux()
mux.Handle("/test", &mockHandler{content: "json"})
var server *http.Server
server = &http.Server{
Addr: ":9010",
WriteTimeout: time.Second * 4,
Handler: mux,
}
go server.ListenAndServe()
config := CreateConfig()
runtime := CreateRuntimeOptions()
config.Protocol = tea.String("HTTP")
config.Endpoint = tea.String("127.0.0.1:9009")
client, _err := NewClient(config)
tea_util.AssertNil(t, _err)
// formData
params := &Params{
Action: tea.String("TestAPI"),
Version: tea.String("2022-06-01"),
Protocol: tea.String("HTTPS"),
Pathname: tea.String("/test"),
Method: tea.String("POST"),
AuthType: tea.String("AK"),
Style: tea.String("RPC"),
ReqBodyType: tea.String("formData"),
BodyType: tea.String("json"),
}
body := map[string]interface{}{}
body["key1"] = tea.String("value")
body["key2"] = tea.Int(1)
body["key3"] = tea.Bool(true)
request := &OpenApiRequest{
Body: openapiutil.ParseToMap(body),
}
result, _err := client.CallApi(params, request, runtime)
tea_util.AssertNil(t, _err)

headers, _err := util.AssertAsMap(result["headers"])
tea_util.AssertNil(t, _err)
tea_util.AssertEqual(t, "key1=value&key2=1&key3=true", headers["raw-body"])
tea_util.AssertEqual(t, "application/x-www-form-urlencoded", headers["content-type"])

// json
params.ReqBodyType = tea.String("json")
result, _err = client.CallApi(params, request, runtime)
tea_util.AssertNil(t, _err)

headers, _err = util.AssertAsMap(result["headers"])
tea_util.AssertNil(t, _err)
tea_util.AssertEqual(t, "{\"key1\":\"value\",\"key2\":1,\"key3\":true}", headers["raw-body"])
tea_util.AssertEqual(t, "application/json; charset=utf-8", headers["content-type"])

// byte
params.ReqBodyType = tea.String("byte")
byteBody := util.ToBytes(tea.String("test byte"))
request = &OpenApiRequest{
Body: byteBody,
}
result, _err = client.CallApi(params, request, runtime)
tea_util.AssertNil(t, _err)

headers, _err = util.AssertAsMap(result["headers"])
tea_util.AssertNil(t, _err)
tea_util.AssertEqual(t, "test byte", headers["raw-body"])
tea_util.AssertEqual(t, "text/plain; charset=utf-8", headers["content-type"])

// stream
params.ReqBodyType = tea.String("binary")
streamBody := strings.NewReader("test byte")
request = &OpenApiRequest{
Stream: streamBody,
}
result, _err = client.CallApi(params, request, runtime)
tea_util.AssertNil(t, _err)

headers, _err = util.AssertAsMap(result["headers"])
tea_util.AssertNil(t, _err)
tea_util.AssertEqual(t, "test byte", headers["raw-body"])
tea_util.AssertEqual(t, "application/octet-stream", headers["content-type"])
}
6 changes: 5 additions & 1 deletion java/src/main/java/com/aliyun/teaopenapi/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -786,7 +786,11 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception {
request_.headers.put("content-type", "application/octet-stream");
} else {
if (!com.aliyun.teautil.Common.isUnset(request.body)) {
if (com.aliyun.teautil.Common.equalString(params.reqBodyType, "json")) {
if (com.aliyun.teautil.Common.equalString(params.reqBodyType, "byte")) {
byte[] byteObj = com.aliyun.teautil.Common.assertAsBytes(request.body);
hashedRequestPayload = com.aliyun.openapiutil.Client.hexEncode(com.aliyun.openapiutil.Client.hash(byteObj, signatureAlgorithm));
request_.body = Tea.toReadable(byteObj);
} else if (com.aliyun.teautil.Common.equalString(params.reqBodyType, "json")) {
String jsonObj = com.aliyun.teautil.Common.toJSONString(request.body);
hashedRequestPayload = com.aliyun.openapiutil.Client.hexEncode(com.aliyun.openapiutil.Client.hash(com.aliyun.teautil.Common.toBytes(jsonObj), signatureAlgorithm));
request_.body = Tea.toReadable(jsonObj);
Expand Down
73 changes: 73 additions & 0 deletions java/src/test/java/com/aliyun/teaopenapi/ClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.junit.Rule;
import org.junit.Test;

import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.Map;

Expand Down Expand Up @@ -695,4 +696,76 @@ public void testResponseBodyType() throws Exception {
}

}

@Test
public void testRequestBodyType() throws Exception {
String responseBody = "{\"AppId\":\"test\", \"ClassId\":\"test\", \"UserId\":123}";
Config config = ClientTest.createConfig();
RuntimeOptions runtime = ClientTest.createRuntimeOptions();
config.protocol = "HTTP";
config.endpoint = "localhost:" + wireMock.port();
Client client = new Client(config);

// formData
Params params = Params.build(TeaConverter.buildMap(
new TeaPair("action", "TestAPI"),
new TeaPair("version", "2022-06-01"),
new TeaPair("protocol", "HTTPS"),
new TeaPair("pathname", "/test"),
new TeaPair("method", "POST"),
new TeaPair("authType", "AK"),
new TeaPair("style", "RPC"),
new TeaPair("reqBodyType", "formData"),
new TeaPair("bodyType", "json")
));
java.util.Map<String, Object> body = new java.util.HashMap<>();
body.put("key1", "value");
body.put("key2", 1);
body.put("key3", true);
OpenApiRequest request = OpenApiRequest.build(TeaConverter.buildMap(
new TeaPair("body", com.aliyun.openapiutil.Client.parseToMap(body))
));
StringBuilder requestBody = new StringBuilder();
for (String key : ((java.util.Map<String, Object>) request.body).keySet()) {
requestBody.append(key).append("=").append(((Map<?, ?>) request.body).get(key));
requestBody.append("&");
}
stubFor(post(urlMatching("/test\\?.+"))
.withRequestBody(equalTo(requestBody.deleteCharAt(requestBody.length() - 1).toString()))
.withHeader("content-type", equalTo("application/x-www-form-urlencoded"))
.willReturn(aResponse().withStatus(200).withBody(responseBody)));
Map<String, ?> result = client.callApi(params, request, runtime);
Assert.assertEquals(200, result.get("statusCode"));

// json
params.setReqBodyType("json");
stubFor(post(urlMatching("/test\\?.+")).withRequestBody(equalToJson("{\"key1\":\"value\",\"key2\":1,\"key3\":true}"))
.withHeader("content-type", equalTo("application/json; charset=UTF-8"))
.willReturn(aResponse().withStatus(200).withBody(responseBody)));
result = client.callApi(params, request, runtime);
Assert.assertEquals(200, result.get("statusCode"));

// byte
params.setReqBodyType("byte");
request = OpenApiRequest.build(TeaConverter.buildMap(
new TeaPair("body", com.aliyun.teautil.Common.toBytes("test byte"))
));
stubFor(post(urlMatching("/test\\?.+")).withRequestBody(equalTo("test byte"))
.withHeader("content-type", equalTo("application/json; charset=UTF-8;"))
.willReturn(aResponse().withStatus(200).withBody(responseBody)));
result = client.callApi(params, request, runtime);
Assert.assertEquals(200, result.get("statusCode"));

// stream
params.setReqBodyType("binary");
request = OpenApiRequest.build(TeaConverter.buildMap(
new TeaPair("stream", new ByteArrayInputStream("test byte".getBytes("UTF-8")))
));
stubFor(post(urlMatching("/test\\?.+")).withRequestBody(equalTo("test byte"))
.withHeader("content-type", equalTo("application/octet-stream"))
.willReturn(aResponse().withStatus(200).withBody(responseBody)));
result = client.callApi(params, request, runtime);
Assert.assertEquals(200, result.get("statusCode"));

}
}
6 changes: 5 additions & 1 deletion main.tea
Original file line number Diff line number Diff line change
Expand Up @@ -707,7 +707,11 @@ api doRequest(params: Params, request: OpenApiRequest, runtime: Util.RuntimeOpti
__request.headers.content-type = 'application/octet-stream';
} else {
if (!Util.isUnset(request.body)) {
if (Util.equalString(params.reqBodyType, 'json')) {
if (Util.equalString(params.reqBodyType, 'byte')) {
var byteObj = Util.assertAsBytes(request.body);
hashedRequestPayload = OpenApiUtil.hexEncode(OpenApiUtil.hash(byteObj, signatureAlgorithm));
__request.body = byteObj;
} else if (Util.equalString(params.reqBodyType, 'json')) {
var jsonObj = Util.toJSONString(request.body);
hashedRequestPayload = OpenApiUtil.hexEncode(OpenApiUtil.hash(Util.toBytes(jsonObj), signatureAlgorithm));
__request.body = jsonObj;
Expand Down
6 changes: 5 additions & 1 deletion php/src/OpenApiClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -773,7 +773,11 @@ public function doRequest($params, $request, $runtime)
$_request->headers["content-type"] = "application/octet-stream";
} else {
if (!Utils::isUnset($request->body)) {
if (Utils::equalString($params->reqBodyType, "json")) {
if (Utils::equalString($params->reqBodyType, "byte")) {
$byteObj = Utils::assertAsBytes($request->body);
$hashedRequestPayload = OpenApiUtilClient::hexEncode(OpenApiUtilClient::hash($byteObj, $signatureAlgorithm));
$_request->body = $byteObj;
} else if (Utils::equalString($params->reqBodyType, "json")) {
$jsonObj = Utils::toJSONString($request->body);
$hashedRequestPayload = OpenApiUtilClient::hexEncode(OpenApiUtilClient::hash(Utils::toBytes($jsonObj), $signatureAlgorithm));
$_request->body = $jsonObj;
Expand Down
12 changes: 10 additions & 2 deletions python/alibabacloud_tea_openapi/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -1222,7 +1222,11 @@ def do_request(
_request.headers['content-type'] = 'application/octet-stream'
else:
if not UtilClient.is_unset(request.body):
if UtilClient.equal_string(params.req_body_type, 'json'):
if UtilClient.equal_string(params.req_body_type, 'byte'):
byte_obj = UtilClient.assert_as_bytes(request.body)
hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(byte_obj, signature_algorithm))
_request.body = byte_obj
elif UtilClient.equal_string(params.req_body_type, 'json'):
json_obj = UtilClient.to_jsonstring(request.body)
hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(UtilClient.to_bytes(json_obj), signature_algorithm))
_request.body = json_obj
Expand Down Expand Up @@ -1410,7 +1414,11 @@ async def do_request_async(
_request.headers['content-type'] = 'application/octet-stream'
else:
if not UtilClient.is_unset(request.body):
if UtilClient.equal_string(params.req_body_type, 'json'):
if UtilClient.equal_string(params.req_body_type, 'byte'):
byte_obj = UtilClient.assert_as_bytes(request.body)
hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(byte_obj, signature_algorithm))
_request.body = byte_obj
elif UtilClient.equal_string(params.req_body_type, 'json'):
json_obj = UtilClient.to_jsonstring(request.body)
hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(UtilClient.to_bytes(json_obj), signature_algorithm))
_request.body = json_obj
Expand Down
2 changes: 1 addition & 1 deletion python/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"""
setup module for alibabacloud_tea_openapi.
Created on 13/11/2023
Created on 21/11/2023
@author: Alibaba Cloud SDK
"""
Expand Down
Loading

0 comments on commit 861e845

Please sign in to comment.